package cn.edu.lingnan.service;

import cn.edu.lingnan.user.Statistics.*;
import cn.edu.lingnan.user.dtos.UserStatisticsRequestDTO;
import cn.edu.lingnan.user.pojos.ExamedPaper;
import cn.edu.lingnan.user.pojos.UserExam;
import cn.edu.lingnan.user.vos.*;

import java.util.List;

public interface StatisticsService {
    /**
     * 批阅所有状态为3（考试结束）的考试，计算每个提交用户的分数并更新数据库
     */
    void gradeAllEndedExams();

    ExamedPaper getExamedPaper(Integer paperId, Integer examId, Integer userId);

    PaperSatisticsVo statisticsScore(Integer examId, Integer paperId);


    // (a)
    ExamScoreStatsVO getExamScoreStats(Integer examId);

    // (b)
    ScoreDistributionVO getScoreDistribution(Integer examId);

    // (c)
    List<UserExamScoreVO> getTop3AnswerSheets(Integer examId);

    // (d)
    List<UserExamScoreVO> getWorst3AnswerSheets(Integer examId);

    // 组合：一次返回 (a)(b)(c)(d)
    ExamAllStatsVO getAllExamStats(Integer examId);

    void ReviewExamedPaper(UserExam userExam);

    /**
     * 获取用户统计数据。
     *
     * @param requestDTO 统计请求参数，包括日期和周期。
     * @return 用户统计视图对象 VO。
     */
    UserStatisticsVO getUserStatistics(UserStatisticsRequestDTO requestDTO);

    void saveDiagnosis(Integer examId, Integer currentId,String diagnosis);


    //下面是管理员统计service
    // 统计平均分排名前三的学生
    List<TopStudentVO> getTopStudents();

    // 统计所有学生的分数段人数
    List<ScoreRangeVO> getScoreRanges();

    // 统计成绩最好的三份试卷
    List<ExamPerformanceVO> getBestExams();

    // 统计成绩最差的三份试卷
    List<ExamPerformanceVO> getWorstExams();

    // 统计最近一年考试的平均分变化趋势
    List<AverageScoreTrendVO> getAverageScoreTrend();
}
